Saving Graphs to File
- Don’t use the mouse
- Use
ggsave for ggplot
- Practice by saving the following plot to file:
ggsave("my_plot.png", p)
Saving 7 x 7 in image

- Base R way: print plots “to screen”, sandwiched between
pdf()/jpeg()/png()… and dev.off().
- Vector vs. raster: Images are stored on your computer as either vector or raster.
Scales; Colour
Scale functions in ggplot2 take the form scale_[aesthetic]_[mapping]().
Let’s first focus on the following plot:

- Change the y-axis tick mark spacing to 10; change the colour spacing to include all powers of 10.

- Specify
scales::*_format in the labels argument of a scale function to do the following:
- Change the x-axis labels to dollar format (use
scales::dollar_format())
- Change the colour labels to comma format (use
scales::comma_format())

- Use
RColorBrewer to change the colour scheme.
- Notice the three different types of scales: sequential, diverging, and continuous.

- Use
viridis to change the colour to a colour-blind friendly scheme
- Hint: add
scale_colour_viridis_c (c stands for continuous; d discrete).
- You can choose a palette with
option.

Theming
Changing the look of a graphic can be achieved through the theme() layer.
There are “complete themes” that come with ggplot2, my favourite being theme_bw (I’ve grown tired of the default gray background, so theme_bw is refreshing).
- Change the theme of the following plot to
theme_bw():

- Then, change font size of axis labels, and the strip background colour. Others?

Plotly
Consider the following plot:

- Convert it to a
plotly object by applying the ggplotly() function:
- You can save a plotly graph locally as an html file. Try saving the above:
- NOTE: plotly graphs don’t seem to show up in Rmd notebooks, but they do with Rmd documents.
- Run this code to see the json format underneath:
install.packages("listviewer")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:
https://cran.rstudio.com/bin/windows/Rtools/
Installing package into 愼㸱愼㹥C:/Users/Jane/Documents/R/win-library/3.5愼㸱愼㹦
(as 愼㸱愼㹥lib愼㸱愼㹦 is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.5/listviewer_2.1.0.zip'
Content type 'application/zip' length 355290 bytes (346 KB)
downloaded 346 KB
package ‘listviewer’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\Jane\AppData\Local\Temp\RtmpQrriXH\downloaded_packages
install.packages("listviewer")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:
https://cran.rstudio.com/bin/windows/Rtools/
Installing package into 愼㸱愼㹥C:/Users/Jane/Documents/R/win-library/3.5愼㸱愼㹦
(as 愼㸱愼㹥lib愼㸱愼㹦 is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.5/listviewer_2.1.0.zip'
Content type 'application/zip' length 355290 bytes (346 KB)
downloaded 346 KB
package ‘listviewer’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\Jane\AppData\Local\Temp\RtmpQrriXH\downloaded_packages
p %>%
ggplotly() %>%
plotly_json()
- Check out code to make a plotly object from scratch using
plot_ly() – scatterplot of gdpPercap vs lifeExp.
- Add population to form a z-axis for a 3D plot:
LS0tDQp0aXRsZTogImNtMDEzIEV4ZXJjaXNlIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7cn0NCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHRpZHl2ZXJzZSkpDQpsaWJyYXJ5KGdhcG1pbmRlcikNCmBgYA0KDQoNCiMgU2F2aW5nIEdyYXBocyB0byBGaWxlDQoNCi0gRG9uJ3QgdXNlIHRoZSBtb3VzZQ0KLSBVc2UgYGdnc2F2ZWAgZm9yIGdncGxvdA0KICAgIC0gUHJhY3RpY2UgYnkgc2F2aW5nIHRoZSBmb2xsb3dpbmcgcGxvdCB0byBmaWxlOiANCg0KYGBge3J9DQpwIDwtIGdncGxvdChtdGNhcnMsIGFlcyhocCwgd3QpKSArIA0KICAgIGdlb21fcG9pbnQoKQ0KZ2dzYXZlKCJteV9wbG90LnBuZyIsIHApDQpgYGANCg0KLSBCYXNlIFIgd2F5OiBwcmludCBwbG90cyAidG8gc2NyZWVuIiwgc2FuZHdpY2hlZCBiZXR3ZWVuIGBwZGYoKWAvYGpwZWcoKWAvYHBuZygpYC4uLiBhbmQgYGRldi5vZmYoKWAuIA0KLSBWZWN0b3IgdnMuIHJhc3RlcjogSW1hZ2VzIGFyZSBzdG9yZWQgb24geW91ciBjb21wdXRlciBhcyBlaXRoZXIgX3ZlY3Rvcl8gb3IgX3Jhc3Rlcl8uDQogICAgLSBfX1Jhc3Rlcl9fOiBhbiBgbmAgYnkgYG1gIGdyaWQgb2YgcGl4ZWxzLCBlYWNoIHdpdGggaXRzIG93biBjb2xvdXIuIGBqcGVnYCwgYHBuZ2AsIGBnaWZgLCBgYm1wYC4NCiAgICAtIF9fVmVjdG9yX186IHJlcHJlc2VudGVkIGFzIHNoYXBlcyBhbmQgbGluZXMuIGBwZGZgLCBbYHN2Z2BdKGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vZ3JhcGhpY3Mvc3ZnX2ludHJvLmFzcCkuDQogICAgLSBGb3IgdGlwczogWyIxMCB0aXBzIGZvciBtYWtpbmcgeW91ciBSIGdyYXBoaWNzIGxvb2sgdGhlaXIgYmVzdCIiXShodHRwOi8vYmxvZy5yZXZvbHV0aW9uYW5hbHl0aWNzLmNvbS8yMDA5LzAxLzEwLXRpcHMtZm9yLW1ha2luZy15b3VyLXItZ3JhcGhpY3MtbG9vay10aGVpci1iZXN0Lmh0bWwpLg0KICAgIA0KIyBTY2FsZXM7IENvbG91cg0KDQpTY2FsZSBmdW5jdGlvbnMgaW4gYGdncGxvdDJgIHRha2UgdGhlIGZvcm0gYHNjYWxlX1thZXN0aGV0aWNdX1ttYXBwaW5nXSgpYC4NCg0KTGV0J3MgZmlyc3QgZm9jdXMgb24gdGhlIGZvbGxvd2luZyBwbG90Og0KDQpgYGB7cn0NCnBfc2NhbGVzIDwtIGdncGxvdChnYXBtaW5kZXIsIGFlcyhnZHBQZXJjYXAsIGxpZmVFeHApKSArDQogICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1wb3ApLCBhbHBoYT0wLjIpDQpwX3NjYWxlcyArIA0KICAgIHNjYWxlX3hfbG9nMTAoKSArDQogICAgc2NhbGVfY29sb3VyX2NvbnRpbnVvdXModHJhbnM9ImxvZzEwIikNCmBgYA0KDQoxLiBDaGFuZ2UgdGhlIHktYXhpcyB0aWNrIG1hcmsgc3BhY2luZyB0byAxMDsgY2hhbmdlIHRoZSBjb2xvdXIgc3BhY2luZyB0byBpbmNsdWRlIGFsbCBwb3dlcnMgb2YgMTAuDQoNCmBgYHtyfQ0KcF9zY2FsZXMgKw0KICAgIHNjYWxlX3hfbG9nMTAoKSArDQogICAgc2NhbGVfY29sb3VyX2NvbnRpbnVvdXMoDQogICAgICAgIHRyYW5zICA9ICJsb2cxMCIsIA0KICAgICAgICBicmVha3MgPSAxMF4oMToxMCkNCiAgICApICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTE6MTAqMTApDQpgYGANCg0KMi4gU3BlY2lmeSBgc2NhbGVzOjoqX2Zvcm1hdGAgaW4gdGhlIGBsYWJlbHNgIGFyZ3VtZW50IG9mIGEgc2NhbGUgZnVuY3Rpb24gdG8gZG8gdGhlIGZvbGxvd2luZzoNCiAgICAtIENoYW5nZSB0aGUgeC1heGlzIGxhYmVscyB0byBkb2xsYXIgZm9ybWF0ICh1c2UgYHNjYWxlczo6ZG9sbGFyX2Zvcm1hdCgpYCkNCiAgICAtIENoYW5nZSB0aGUgY29sb3VyIGxhYmVscyB0byBjb21tYSBmb3JtYXQgKHVzZSBgc2NhbGVzOjpjb21tYV9mb3JtYXQoKWApDQoNCmBgYHtyfQ0KbGlicmFyeShzY2FsZXMpDQpwX3NjYWxlcyArDQogICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArDQogICAgc2NhbGVfY29sb3VyX2NvbnRpbnVvdXMoDQogICAgICAgIHRyYW5zICA9ICJsb2cxMCIsIA0KICAgICAgICBicmVha3MgPSAxMF4oMToxMCksDQogICAgICAgIGxhYmVscyA9IGNvbW1hX2Zvcm1hdCgpDQogICAgKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpDQpgYGANCg0KMy4gVXNlIGBSQ29sb3JCcmV3ZXJgIHRvIGNoYW5nZSB0aGUgY29sb3VyIHNjaGVtZS4NCiAgICAtIE5vdGljZSB0aGUgdGhyZWUgZGlmZmVyZW50IHR5cGVzIG9mIHNjYWxlczogc2VxdWVudGlhbCwgZGl2ZXJnaW5nLCBhbmQgY29udGludW91cy4NCg0KYGBge3J9DQojIyBBbGwgcGFsZXR0ZXMgdGhlIGNvbWUgd2l0aCBSQ29sb3JCcmV3ZXI6DQpSQ29sb3JCcmV3ZXI6OmRpc3BsYXkuYnJld2VyLmFsbCgpDQpwX3NjYWxlcyArDQogICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArDQogICAgc2NhbGVfY29sb3JfZGlzdGlsbGVyKA0KICAgICAgICB0cmFucyAgID0gImxvZzEwIiwNCiAgICAgICAgYnJlYWtzICA9IDEwXigxOjEwKSwNCiAgICAgICAgbGFiZWxzICA9IGNvbW1hX2Zvcm1hdCgpLA0KICAgICAgICBwYWxldHRlID0gIlJlZHMiDQogICAgKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpDQpgYGANCg0KNC4gVXNlIGB2aXJpZGlzYCB0byBjaGFuZ2UgdGhlIGNvbG91ciB0byBhIGNvbG91ci1ibGluZCBmcmllbmRseSBzY2hlbWUNCiAgICAtIEhpbnQ6IGFkZCBgc2NhbGVfY29sb3VyX3ZpcmlkaXNfY2AgKGBjYCBzdGFuZHMgZm9yIGNvbnRpbnVvdXM7IGBkYCBkaXNjcmV0ZSkuDQogICAgLSBZb3UgY2FuIGNob29zZSBhIHBhbGV0dGUgd2l0aCBgb3B0aW9uYC4NCg0KYGBge3J9DQpwX3NjYWxlcyArDQogICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArDQogICAgc2NhbGVfY29sb3JfdmlyaWRpc19jKA0KICAgICAgICB0cmFucyAgID0gImxvZzEwIiwNCiAgICAgICAgYnJlYWtzICA9IDEwXigxOjEwKSwNCiAgICAgICAgbGFiZWxzICA9IGNvbW1hX2Zvcm1hdCgpDQogICAgKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpDQpgYGANCg0KIyBUaGVtaW5nDQoNCkNoYW5naW5nIHRoZSBsb29rIG9mIGEgZ3JhcGhpYyBjYW4gYmUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgYHRoZW1lKClgIGxheWVyLg0KDQpUaGVyZSBhcmUgWyJjb21wbGV0ZSB0aGVtZXMiXShodHRwOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9nZ3RoZW1lLmh0bWwpIHRoYXQgY29tZSB3aXRoIGBnZ3Bsb3QyYCwgbXkgZmF2b3VyaXRlIGJlaW5nIGB0aGVtZV9id2AgKEkndmUgZ3Jvd24gdGlyZWQgb2YgdGhlIGRlZmF1bHQgZ3JheSBiYWNrZ3JvdW5kLCBzbyBgdGhlbWVfYndgIGlzIHJlZnJlc2hpbmcpLg0KDQoxLiBDaGFuZ2UgdGhlIHRoZW1lIG9mIHRoZSBmb2xsb3dpbmcgcGxvdCB0byBgdGhlbWVfYncoKWA6DQoNCmBgYHtyfQ0KZ2dwbG90KGlyaXMsIGFlcyhTZXBhbC5XaWR0aCwgU2VwYWwuTGVuZ3RoKSkgKw0KICAgICBmYWNldF93cmFwKH4gU3BlY2llcykgKw0KICAgICBnZW9tX3BvaW50KCkgKw0KICAgICBsYWJzKHggPSAiU2VwYWwgV2lkdGgiLA0KICAgICAgICAgIHkgPSAiU2VwYWwgTGVuZ3RoIiwNCiAgICAgICAgICB0aXRsZSA9ICJTZXBhbCBzaXplcyBvZiB0aHJlZSBwbGFudCBzcGVjaWVzIikrDQogIHRoZW1lX2J3KCkNCmBgYA0KDQoyLiBUaGVuLCBjaGFuZ2UgZm9udCBzaXplIG9mIGF4aXMgbGFiZWxzLCBhbmQgdGhlIHN0cmlwIGJhY2tncm91bmQgY29sb3VyLiBPdGhlcnM/DQoNCmBgYHtyfQ0KZ2dwbG90KGlyaXMsIGFlcyhTZXBhbC5XaWR0aCwgU2VwYWwuTGVuZ3RoKSkgKw0KICAgICBmYWNldF93cmFwKH4gU3BlY2llcykgKw0KICAgICBnZW9tX3BvaW50KCkgKw0KICAgICBsYWJzKHggPSAiU2VwYWwgV2lkdGgiLA0KICAgICAgICAgIHkgPSAiU2VwYWwgTGVuZ3RoIiwNCiAgICAgICAgICB0aXRsZSA9ICJTZXBhbCBzaXplcyBvZiB0aHJlZSBwbGFudCBzcGVjaWVzIikgKw0KICAgIHRoZW1lX2J3KCkgKw0KICAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwNCiAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9ICJvcmFuZ2UiKSwNCiAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYmx1ZSIpKQ0KYGBgDQoNCg0KIyBQbG90bHkNCg0KQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBwbG90Og0KDQpgYGB7cn0NCihwIDwtIGdhcG1pbmRlciAlPiUgDQogICAgIGZpbHRlcihjb250aW5lbnQgIT0gIk9jZWFuaWEiKSAlPiUgDQogICAgIGdncGxvdChhZXMoZ2RwUGVyY2FwLCBsaWZlRXhwKSkgKw0KICAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9cG9wKSwgYWxwaGE9MC4yKSArDQogICAgIHNjYWxlX3hfbG9nMTAobGFiZWxzPWRvbGxhcl9mb3JtYXQoKSkgKw0KICAgICBzY2FsZV9jb2xvdXJfZGlzdGlsbGVyKA0KICAgICAgICAgdHJhbnMgICA9ICJsb2cxMCIsDQogICAgICAgICBicmVha3MgID0gMTBeKDE6MTApLA0KICAgICAgICAgbGFiZWxzICA9IGNvbW1hX2Zvcm1hdCgpLA0KICAgICAgICAgcGFsZXR0ZSA9ICJHcmVlbnMiDQogICAgICkgKw0KICAgICBmYWNldF93cmFwKH4gY29udGluZW50KSArDQogICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3M9MTAqKDE6MTApKSArDQogICAgIHRoZW1lX2J3KCkpDQpgYGANCg0KMS4gQ29udmVydCBpdCB0byBhIGBwbG90bHlgIG9iamVjdCBieSBhcHBseWluZyB0aGUgYGdncGxvdGx5KClgIGZ1bmN0aW9uOg0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQpsaWJyYXJ5KHBsb3RseSkNCmdncGxvdGx5KHApDQpgYGANCg0KMi4gWW91IGNhbiBzYXZlIGEgcGxvdGx5IGdyYXBoIGxvY2FsbHkgYXMgYW4gaHRtbCBmaWxlLiBUcnkgc2F2aW5nIHRoZSBhYm92ZToNCiAgICAtIE5PVEU6IHBsb3RseSBncmFwaHMgZG9uJ3Qgc2VlbSB0byBzaG93IHVwIGluIFJtZCBfbm90ZWJvb2tzXywgYnV0IHRoZXkgZG8gd2l0aCBSbWQgX2RvY3VtZW50c18uDQoNCmBgYHtyfQ0KcCAlPiUgDQogICAgZ2dwbG90bHkoKSAlPiUgDQogICAgaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoIkxPQ0FUSU9OX0dPRVNfSEVSRSIpDQpgYGANCg0KDQozLiBSdW4gdGhpcyBjb2RlIHRvIHNlZSB0aGUganNvbiBmb3JtYXQgdW5kZXJuZWF0aDoNCg0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJsaXN0dmlld2VyIikNCnAgJT4lIA0KICAgIGdncGxvdGx5KCkgJT4lIA0KICAgIHBsb3RseV9qc29uKCkNCmBgYA0KDQoNCjQuIENoZWNrIG91dCBjb2RlIHRvIG1ha2UgYSBwbG90bHkgb2JqZWN0IGZyb20gc2NyYXRjaCB1c2luZyBgcGxvdF9seSgpYCAtLSBzY2F0dGVycGxvdCBvZiBnZHBQZXJjYXAgdnMgbGlmZUV4cC4NCiAgICAtIENoZWNrIG91dCB0aGUgW2NoZWF0IHNoZWV0XShodHRwczovL2ltYWdlcy5wbG90Lmx5L3Bsb3RseS1kb2N1bWVudGF0aW9uL2ltYWdlcy9yX2NoZWF0X3NoZWV0LnBkZikuDQoNCmBgYHtyfQ0KcGxvdF9seShnYXBtaW5kZXIsIA0KICAgICAgICB4ID0gfmdkcFBlcmNhcCwgDQogICAgICAgIHkgPSB+bGlmZUV4cCwgDQogICAgICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgICAgIG1vZGUgPSAibWFya2VycyIsDQogICAgICAgIG9wYWNpdHkgPSAwLjIpICU+JSANCiAgICBsYXlvdXQoeGF4aXMgPSBsaXN0KHR5cGUgPSAibG9nIikpDQpgYGANCg0KNS4gQWRkIHBvcHVsYXRpb24gdG8gZm9ybSBhIHotYXhpcyBmb3IgYSAzRCBwbG90Og0KDQpgYGB7cn0NCnBsb3RfbHkoZ2FwbWluZGVyLCANCiAgICAgICAgeCA9IH5nZHBQZXJjYXAsIA0KICAgICAgICB5ID0gfmxpZmVFeHAsIA0KICAgICAgICB6ID0gfnBvcCwNCiAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLA0KICAgICAgICBtb2RlID0gIm1hcmtlcnMiLA0KICAgICAgICBvcGFjaXR5ID0gMC4yKQ0KYGBgDQoNCg0KDQo=